﻿#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <iterator>
using namespace std;


//实现string
//
namespace bit
{
	class string
	{
	public:
		//迭代器
		typedef char* iterator;
		typedef const char* const_iterator;

		iterator begin();
		iterator end();

		const_iterator  begin()const;
		const_iterator end() const;


		//构造/析构
		//string();
		//无参/带参合一：全缺省：传参
		string(const char* str ="");
		//拷贝构造：
		string(const string& s);
		//赋值拷贝：
		//比原 长/短/一样
		string& operator=(const string& s);


		~string();
		const char* c_str() const;//加上const(非const也可以调用)

		//加上size和【】就可以对字符串数组进行访问
		size_t size() const;
		char& operator[](size_t pos);
		const char& operator[](size_t pos)const;

		//插入
		void reserve(size_t n);
		void push_back(char ch);
		void append(const char* str);

		//使用运算符重载：增加阅读性
		string& operator+=(char ch);
		string& operator+=(const char* ch);

		void insert(size_t pos, char ch);
		void insert(size_t pos, const char* str);
		void erase(size_t pos, size_t len = npos);
		
		size_t find(char ch, size_t pos = 0);
		size_t find(const char* sub, size_t pos = 0);

		//s1.swap(s3)
		//交换指针（地址的指向）
		void swap(string& s);

		//获取一段字符
		string substr(size_t pos = 0, size_t len=npos);

		//比较大小：写2复用
		bool operator<(const string& s)const;
		bool operator>(const string& s)const;
		bool operator>=(const string& s)const;
		bool operator<=(const string& s)const;
		bool operator==(const string& s)const;
		bool operator!=(const string& s)const;

		//清除
		void clear();


	private:
		char* _str;
		size_t _size;
		size_t _capacity;

		const static size_t npos;
		//静态成员变量初始化：类外定义

		//特例：整型
		//const static size_t npos = -1;
		//这里既是声明也是定义
		//静态成员变量：在类内部给值：不是初始化，是给缺省值（初始化列表）
		//但是它不会走初始化列表

		//double都不可以:整形可以类内给值
		// ❌
		//const static double s = 2.2;
		

	};

	//流插入流提取不适合写成成员函数
	istream& operator>>(istream& is, string& str);
	ostream& operator<<(ostream& os, const string& str);
	
}



